package com.example.lab.controller;

import com.example.lab.entity.SafetyChecks;
import com.example.lab.entity.dto.SafetyCheckDTO;
import com.example.lab.result.PageResult;
import com.example.lab.result.Result;
import com.example.lab.service.ISafetyChecksService;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDate;

/**
 * 安全检查控制器类，用于处理与安全检查相关的API请求
 */
@RestController
@RequestMapping("/api/safety-checks")
@RequiredArgsConstructor
public class SafetyCheckController {

    private final ISafetyChecksService safetyChecksService;

    /**
     * 获取安全检查记录
     *
     * @param semesterId 学期ID，可选参数
     * @param labId 实验室ID，可选参数
     * @param status 安全检查状态，可选参数
     * @param startDate 开始日期，可选参数
     * @param endDate 结束日期，可选参数
     * @param page 页码，必选参数，默认值为1
     * @param limit 每页记录数，必选参数，默认值为10
     * @return 返回安全检查记录的分页结果
     */
    @GetMapping
    public Result<PageResult<SafetyCheckDTO>> getSafetyChecks(
            @RequestParam(required = false) Integer semesterId,
            @RequestParam(required = false) Integer labId,
            @RequestParam(required = false) String status,
            @RequestParam(required = false) LocalDate startDate,
            @RequestParam(required = false) LocalDate endDate,
            @RequestParam(defaultValue = "1") Integer page,
            @RequestParam(defaultValue = "10") Integer limit) {

        PageResult<SafetyCheckDTO> result = safetyChecksService.getSafetyChecks(
                semesterId, labId, status, startDate, endDate, page, limit);
        return Result.success(result);
    }

    /**
     * 创建新的安全检查记录
     *
     * @param safetyCheck 新的安全检查记录对象
     * @return 如果创建成功，返回成功结果及检查记录ID；否则返回失败结果
     */
    @PostMapping
    public Result<?> createSafetyCheck(@RequestBody SafetyChecks safetyCheck) {
        boolean success = safetyChecksService.createSafetyCheck(safetyCheck);
        if (success) {
            return Result.success(safetyCheck.getCheckId());
        }
        return Result.fail("创建安全检查记录失败");
    }

    /**
     * 上报安全检查异常
     *
     * @param checkId 安全检查记录ID
     * @return 如果上报成功，返回成功结果；否则返回失败结果
     */
    @PutMapping("/{checkId}/report")
    public Result<?> reportSafetyCheck(@PathVariable Integer checkId) {
        boolean success = safetyChecksService.reportSafetyCheck(checkId);
        if (success) {
            return Result.success();
        }
        return Result.fail("上报安全检查异常失败");
    }

    /**
     * 处理安全检查异常
     *
     * @param checkId 安全检查记录ID
     * @param safetyCheck 包含处理描述的安全检查记录对象
     * @return 如果处理成功，返回成功结果；否则返回失败结果
     */
    @PutMapping("/{checkId}/process")
    public Result<?> processSafetyCheck(
            @PathVariable Integer checkId,
            @RequestBody SafetyChecks safetyCheck) {
        boolean success = safetyChecksService.processSafetyCheck(
                checkId, safetyCheck.getProcessDescription());
        if (success) {
            return Result.success();
        }
        return Result.fail("处理安全检查异常失败");
    }

}
